home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1998 June / SGI Freeware 1998 June.iso / dist / fw_UMINNgopher.idb / usr / freeware / src / gopher_1.12 / object / getopt.c.z / getopt.c
C/C++ Source or Header  |  1997-09-09  |  1KB  |  68 lines

  1. /*
  2. **  GETOPT PROGRAM AND LIBRARY ROUTINE
  3. **
  4. **  I wrote main() and AT&T wrote getopt() and we both put our efforts into
  5. **  the public domain via mod.sources.
  6. **    Rich $alz
  7. **    Mirror Systems
  8. **    (mirror!rs, rs@mirror.TMC.COM)
  9. **    August 10, 1986
  10. ** 
  11. **  This is the public-domain AT&T getopt(3) code.  Hacked by Rich and by Jim.
  12. */
  13.  
  14. #include <stdio.h>
  15.  
  16. #define ERR(_s, _c) { if (opterr) fprintf (stderr, "%s%c\n", argv[0], _s, _c);}
  17.  
  18. int    opterr = 1;
  19. int    optind = 1;
  20. int    optopt;
  21. char    *optarg;
  22.  
  23. int
  24. getopt(argc, argv, opts)
  25. int    argc;
  26. char    **argv, *opts;
  27. {
  28.     static int sp = 1;
  29.     register int c;
  30.     register char *cp;
  31.  
  32.     if(sp == 1)
  33.         if(optind >= argc ||
  34.            argv[optind][0] != '-' || argv[optind][1] == '\0')
  35.             return(EOF);
  36.         else if(strcmp(argv[optind], "--") == NULL) {
  37.             optind++;
  38.             return(EOF);
  39.         }
  40.     optopt = c = argv[optind][sp];
  41.     if(c == ':' || (cp=strchr(opts, c)) == NULL) {
  42.         ERR(": illegal option -- ", c);
  43.         if(argv[optind][++sp] == '\0') {
  44.             optind++;
  45.             sp = 1;
  46.         }
  47.         return('?');
  48.     }
  49.     if(*++cp == ':') {
  50.         if(argv[optind][sp+1] != '\0')
  51.             optarg = &argv[optind++][sp+1];
  52.         else if(++optind >= argc) {
  53.             ERR(": option requires an argument -- ", c);
  54.             sp = 1;
  55.             return('?');
  56.         } else
  57.             optarg = argv[optind++];
  58.         sp = 1;
  59.     } else {
  60.         if(argv[optind][++sp] == '\0') {
  61.             sp = 1;
  62.             optind++;
  63.         }
  64.         optarg = NULL;
  65.     }
  66.     return(c);
  67. }
  68.